# 一个方法里面可以执行增删改查
import os.path
from typing import final

import pymysql
import xlrd


# 定义read_excel函数，参数包括：
# - file: 字符串类型，Excel文件路径
# - sheet: 字符串类型，工作表名称
# - has_header: 布尔值，是否有标题行（默认True）
# 返回值类型提示：列表嵌套元组
def read_excel(file: str, sheet: str, has_header=True) -> list[tuple]:
    """读取Excel行数据，返回列表嵌套元组"""
    try:
        file = file.lstrip("../").lstrip("./")  # 处理相对路径
        # 移除路径开头的"../"和"./"，清理相对路径前缀
        bath_path = os.path.dirname(os.path.dirname(__file__))  # 获取项目根目录
        # __file__是当前脚本的路径
        # 两次调用os.path.dirname()，获取当前脚本所在目录的上一级目录（项目根目录）
        file = os.path.normpath(os.path.join(bath_path, file))  # 拼接文件路径
        # os.path.join()拼接根目录和处理后的路径
        # os.path.normpath()规范化路径（处理斜杠和冗余部分）
        wb = xlrd.open_workbook(file)
        sh = wb.sheet_by_name(sheet)
        # 确定数据读取的起始行：
        # 如果有标题行(has_header=True)，则从第2行(索引1)开始读取
        # 如果有标题行(has_header=False)，则从第1行(索引0)开始读取
        # 如果没有标题行，则从第1行(索引0)开始读取
        start = 1 if has_header else 0
        # 使用列表推导式快速生成结果：
        # 1. 遍历从start到最后一行的所有行
        # 2. 对每一行调用sh.row_values(i)获取该行所有数据
        # 3. 转换为元组(tuple)并添加到列表
        # 4. 最终返回这个列表（列表嵌套元组的格式）
        return [tuple(sh.row_values(i)) for i in range(start, sh.nrows)]
    except Exception as e:
        print(f"错误: {e}")
        return []


def db_util(sql: str, host='localhost', port=3307, user='root', password='', database=''):
    """
    通用数据库操作函数，支持增删改查操作
    Args:
        sql: SQL语句
        host: 数据库主机地址
        port: 数据库端口
        user: 用户名
        password: 密码
        database: 数据库名
    Returns:       查询结果列表（仅SELECT语句返回）

    Raises:
        Exception: SQL执行异常时回滚并抛出异常
    """
    with pymysql.connect(host=host, port=port, user="root", password="123456", database="myschools") as db:
        with db.cursor() as cursor:
            try:
                # 判断SQL类型
                sql_stripped = sql.strip().lower()
                if sql_stripped.startswith('select'):
                    cursor.execute(sql)
                    result = cursor.fetchall()
                    return result
                else:
                    # 处理INSERT/UPDATE/DELETE等操作
                    cursor.execute(sql)
                    db.commit()
                    # 返回受影响的行数
                    return cursor.rowcount
            except Exception as e:
                # 发生异常时回滚事务
                db.rollback()
                raise e


if __name__ == "__main__":
    pass
#     # 含标题行的数据
#     print(read_excel("../data/test_data.xls", "login_data"))
#     # 不含标题行的数据
# print(read_excel("../data/test_data.xls", "login_data", False))
#
# if __name__ == '__main__':
#     # 查询
#     sql = "select * from students"
#     result = db_util(sql)
#     print(result)
